<?php

include_once dirname(__FILE__)."/../common/common.php";

//路由控制器
class Dispatcher{

	private $action_name="";

	private $function_name="";


	//执行请求url分析，转发用户请求
	public function dispatch(){

//        echo "--- in Dispatcher -> dispatch()";

        $request_url=$_SERVER["REQUEST_URI"];

		//从url中分离出模块名称、方法名称、参数列表

        try{

            $this->getModelAndFunc();

        }catch (Exception $e){

            echo "<br>Error msg:".$e->getMessage()."<br>";

            echo "Error line:".$e->getLine()."<br>";
        }


        print_log("action_name:".$this->action_name);
        print_log("function_name:".$this->function_name);


		//按用户请求的action ，加载对应 Controller，如果文件没找到，提示用户请求路径不存在
		$action_fileName=$this->action_name."Controller.php";

		$action_className=$this->action_name."Controller";

		$action_filePath= __DIR__."/../controller/".$action_fileName;

        print_log("--\$action_filePath:$action_filePath");

		try {

			//检查文件是否存在，如果对应文件不存在，提示用户页面不存在
			if(!file_exists($action_filePath)){

				throw new Exception($action_filePath."  action_filePath not found", 404);
			}

			//加载对应action 文件
			include $action_filePath;

			//实例化 controller 类
			$controller =new $action_className();	

			//检查请求的 function 是否存在
			if(!method_exists($controller, $this->function_name)){

				throw new Exception($this->function_name."  function not found", 404);
			}

			//执行action中的对应方法
			$func_name=$this->function_name;

			$controller->$func_name();
			
		} catch (Exception $e) {

			//显示错误信息
			echo "<h3>Error Page<h3>";
			echo "<h4>Code:".$e->getCode()." <h4>";
			echo "<h4>Message:".$e->getMessage()." <h4>";
			echo "<h4>in:".$e->getFile()."  [line:".$e->getLine()."] <h4>";
			
		}

	}


	private function getModelAndFunc(){

		//获取客户端请求url
		$url=$_SERVER["REQUEST_URI"];

        print_log("request url:".$url);

		$conf=include dirname(__FILE__)."/../conf/conf.php";

		$app_name=$conf["APP_NAME"];

		//将 /api/index.php 从 url 中删除

        if(empty($app_name)){

            $url=str_replace("/index.php", "", $url);

        }else{

            $url=str_replace("/$app_name/index.php", "", $url);
        }


		$temp_url=$url;

        print_log("request method:".$_SERVER["REQUEST_METHOD"]);

        print_log($_GET);

		//如果有请求参数，去除url中参数部分
		if(!empty($_GET)){

			$temp_url=substr($url, 0,stripos($url, "?"));
		}

        print_log("---temp_url:".$temp_url);

		//如果截取后字符串为空，表示客户端直接请求 index.php，抛出异常
		if(empty($temp_url)) throw new Exception("You Request index.php", 400);	

		//将字符串转换为数组
		$temp_array=explode("/", $temp_url);

//        echo "--temp_array:".$temp_array."--count:".count($temp_array);


		//如果转换后的数组长度不是3，表示请求格式异常。抛出

        $count=count($temp_array);

		if($count!=3) throw new Exception("请求url格式错误", 400);

		//获取 模块名称
		$this->action_name=$temp_array[1];

		//获取 方法名称
        $function_name=$temp_array[2];

        //在 linux 环境中，不能

		$this->function_name=$temp_array[2];



	}


}


